package cloud.lysky.java.on.concurrent.queue;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * @author luoly
 * @describe ArrayBlockingQueue使用示例
 * @date 2023-05-01 10:43
 **/
public class ArrayBlockingQueueExample {
    public static void main(String[] args) {
        // 创建一个容量为3的ArrayBlockingQueue
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);

        // 创建3个线程，分别向queue中添加元素
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    // 向queue中添加元素
                    queue.put(Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
        // 队列已满，插入元素将被阻塞
        try {
            System.out.println("queue已满，插入元素将被阻塞");
            queue.put("main");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 创建一个线程，从queue中取出元素
        new Thread(() -> {
            try {
                // 从queue中取出元素
                String name1 = queue.take();
                String name2 = queue.take();
                String name3 = queue.take();
                System.out.println("从queue中取出元素：" + name1);
                System.out.println("从queue中取出元素：" + name2);
                System.out.println("从queue中取出元素：" + name3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        // 队列已空，取出元素将被阻塞
        try {
            System.out.println("queue已空，取出元素将被阻塞");
            queue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
